package com.lvhr.rpc.serializer;

import com.lvhr.rpc.spi.SpiLoader;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 序列化器工厂（SPI 动态加载 + 懒汉式单例）
 *
 * @author lvhr
 */
public class SerializerFactory {

    // 单例实例缓存（Key: 序列化器类型, Value: 序列化器实例）
    private static final ConcurrentHashMap<String, Serializer> INSTANCE_CACHE = new ConcurrentHashMap<>();

    // 默认序列化器类型（可配置化扩展）
    private static final String DEFAULT_SERIALIZER_TYPE = SerializerKeys.JDK;

    /**
     * 获取序列化器实例（懒加载 + 线程安全）
     *
     * @param type 序列化器类型，参考 {@link SerializerKeys}
     * @return 序列化器实例，永不为null
     * @throws IllegalArgumentException 类型不存在时抛出
     */
    public static Serializer getInstance(String type) {
        // 参数校验
        if (type == null || type.isEmpty()) {
            type = DEFAULT_SERIALIZER_TYPE;
        }

        // 双重校验锁实现懒加载
        return INSTANCE_CACHE.computeIfAbsent(type, t -> {
            synchronized (SerializerFactory.class) {
                // 再次检查防止其他线程已创建
                if (INSTANCE_CACHE.containsKey(t)) {
                    return INSTANCE_CACHE.get(t);
                }

                // 通过 SPI 加载实例
                Serializer instance = SpiLoader.getInstance(Serializer.class, t);
                if (instance == null) {
                    throw new IllegalArgumentException("Unsupported serializer type: " + t);
                }
                return instance;
            }
        });
    }

    /**
     * 获取默认序列化器（JDK 实现）
     */
    public static Serializer getDefaultInstance() {
        return getInstance(DEFAULT_SERIALIZER_TYPE);
    }
}
